TensorFlow&Pytorch哪家强?
验“金”室
随着深度学习技术的不断发展,越来越多的机器学习框架映入开发者的眼帘。神经网络的研发一般包括训练和测试两个阶段,在这两个阶段中,深度学习的开发者往往将自己比作“炼丹师”:在训练阶段中,开发者将训练数据和神经网络模型等“原料”加入不同的机器学习框架“炼丹炉”中,使用GPU或者CPU作为“三昧真火”不断提炼煅烧,最后所得到的“灵丹”就是神经网络模型的参数。机器学习框架作为整个炼制过程的载体,无疑是极为重要的。
目前,已经涌现出了许多优秀的机器学习框架,如TensorFlow、Pytorch、Keras、Caffe等。而在这些框架中,“炼丹师”们使用最为广泛的当属TensorFlow和Pytorch。
一、TensorFlow
TensorFlow是由Google大脑小组(隶属于Google机器智能研究机构)的工程师们研发出的用于机器学习和深度神经网络方面的研究工具,优秀的通用性使其在别的计算领域也拥有良好的表现。TensorFlow自2015年发布以来收获了良好的口碑,在不断完善自身的同时,也搭建了完整的生态体系。在机器学习的训练阶段,TensorFlow实现了对Python、Swift以及JavaScript的支持;在部署阶段,TensorFlow Serving、TensorFlow Lite以及TensorFlow.js可以满足不同平台部署的需求。
从信息流动层面看,TensorFlow是一个采用数据流图(Data Flow Graphs)用于数值计算的开源软件库(如图1所示)。节点(Nodes)在图中既表示数学操作,也表示数据输入(Feed In)的起点/输出(Push Out)的终点,还可以是写入持久变量(Persistent Variable)的终点。而图中的线(Edges)则表示在节点间相互联系的多为数据数组,即张量(Tensor)。张量从图中流过的直观图形是这个工具取名为“TensorFlow”的原因。
图1 数据流示意图
在我们使用TensorFlow的过程中,数据是以Tensor的形式进行传递的。TensorFlow程序往往被划分为构建阶段和执行阶段。在构建阶段,节点所需要执行的操作(Operation)都会以图的方式进行呈现;在执行阶段,我们使用会话(Session)去执行图中的操作。
为了充分利用计算机资源,TensorFlow可以自动检测可用的CPU/GPU,并优先使用GPU来实现所需执行的操作。值得注意的是,如果有多个GPU,除了第一个GPU,其他的GPU需要指定才能够执行相应的操作。
Tensorflow具有三大特性:灵活性、可移植性、多语言支持。
其灵活性主要表现在可以自己定义“上层库”,定义顺手的符合操作;
灵活的结构可以在多种不同的平台上进行运行;
同时还支持多种语言,用户可以根据自己的需求,使用Python或者C++来构建graphs。
二、Pytorch
Pytorch是由Facebook的人工智能小组所开发的基于Torch的Python开源机器学习库,能够用于自然语言处理等应用程序。在支持动态神经网络的同时,还能实现GPU加速,这一点是现在很多主流框架如TensorFlow都不支持的。Pytorch还提供两个高级功能:具有强大的GPU加速的张量计算(如Numpy)、包含自动求导系统的深度神经网络。除了Facebook之外,Twitter、GMU、Salesforce等机构也都采用了Pytorch。
Pytorch的设计理念是直观易懂,这就意味着它比TensorFlow更加贴近Python哲学:尽量找一种,最好是唯一一种明显的解决方案。当我们执行一行代码时,Pytorch会忠实地执行,我们也可以快速定位到出错代码。许多TensorFlow的使用者表示,在使用TensorFlow进行调试时,由于难以理解底层的实现,在Debug阶段耗费了相当长的时间。
Pytorch最引以为傲的特性当属动态计算,能够方便程序员进行设计和调试,提升开发者的编程体验。
动态计算是指程序按照我们编写的命令进行执行,而静态计算则会在编译执行时优先生成神经网络结构,再执行相应的操作。动态计算的本质其实是动态图机制,每次运行之前都会重新构建一个新图。而静态图机制的代表框架TensorFlow则是一旦构建好图,就会多次地运行它。静态图和动态图的区别如图2所示。
图2 静态图和动态图的区别
在优化方面,静态图框架可以在其运行之前进行优化。如图3所示,自身所构建的图会被优化成具有复合操作的等价图。
图3 静态图的优化
在序列化方面,Pytorch主要采用两种方法序列化以及保存模型:第一种方法只存取模型的参数;第二种方法则将整个模型都保存下来,读取的时候也整个读取。如果将整个模型都保存了下来,并且在过程中使用固定的目录结构,那么代码在进行重构时会很容易出现问题。同时,因为图的构建和执行交织在一起,所以时刻需要最新的代码。相反,对于静态图机制而言,一旦图构建好,就可以进行序列化且无需构图代码来运行它。
三、发展趋势
静态图和动态图机制各有优劣,Pytorch和TensorFlow的发展轨迹如今也交汇到了一起,互相融合、渗透。Pytorch正不断地添加静态特性,而TensorFlow也在发展自己的动态特点。
譬如,TensorFlow Fold通过动态批合(Dynamic Batching)的方法快速构建动态图。
动态批合的重要思想是,给一定数量的计算图,将图中具有相同深度的操作实例批合到一起。通过这种方法,可以在一个静态图上对TreeRNN的不同解析树做处理。不仅如此,在1.7版本的TensorFlow中还更新了新的功能eager execution,这个功能运行用户可以在不创建静态图的情况下运行TensorFlow代码。
与之相对应,Pytorch也通过支持ONNX等标准增强了自身的静态属性。
每个框架都有自己独特的特性,从开发者的角度看,使用者可以根据自己的喜好和需求选择使用的框架。从开发工具的角度看,一个框架不可能垄断整个市场,只有不断地完善,才能在全球市场中保持自身的竞争力。从数据层面上看,目前TensorFlow的依旧保持着较高的市场份额,这得益于Google前期大量的宣传以及投入,但是Pytorch大有迎头赶上之势。
图4来自康奈尔大学Horace He给出的研究报告,展示了在各大顶级会议上,提及Pytorch和提到过TensorFlow或Pytorch的论文之间的比率。所有线条的斜率都为正。
图4 Pytorch在研究领域的占比
为了更加直观地感受Pytorch在研究领域所迸发的强大活力,我们对比了Pytorch和TensorFlow在2018年和2019年各大顶级会议的论文数量(见表1)。
表1 Pytorch和TensorFlow在2018-2019年
各大顶级会议论文数量
从表1可以直观地看到,从2018年到2019年,Pytorch在论文数量上实现了反超,而且最低的涨幅也达到了192%,可见发展速度之迅猛。
研究者偏爱Pytorch的原因不外乎以下三点:
直观易懂。Pytorch属于轻量级,开发者也无需调整编码风格,也更容易调试。
API简洁。相比Pytorch,TensorFlow的API十分混乱,并且同一功能的接口在不同子模块下可能存在多个版本,版本控制极差。
研究者无需考虑部署等问题,只需要实现并验证自己的模型猜想。
不过,在生产方面,TensorFlow仍然处于主导的地位。
一方面,生产和研究在需求上有较大的分歧。研究多以模型验证为主,数据集的数量以及对硬件的要求并没有像工业生产那样那么高。
另一方面,生产多追求性能的稳定,对新技术的渴求并没有那么地强烈,同时注重风险的规避,这一点在金融业尤为突出。在解决方案的部署上,生产环境有许多限制,如部分公司的服务器在运行Python时会增加额外的运营成本;在移动设备和IoT设备上部署机器学习模型时需要面对模型格式转换的问题,而在部署完成之后,还需要考虑后续的更新以及切换等维护问题。针对上述问题,TensorFlow全部都提出了解决方案,使其在工业生产依旧保持着较大的影响力。
未来,不论TensorFlow和Pytorch这两种框架如何发展,作为机器学习的研究者,我们应该关注的应当是自身的研究而不是在用于研究的工具上。无论是使用TensorFlow还是Pytorch,只要能够以符合我们心中预期条件的方式获取到最终结果,就足够了。当然,笔者也由衷地希望能涌现出更多更优秀的框架,使上游的生态愈加丰富,让开发者在进行研究或者生产操作时能更加如鱼得水。
附录
1. Tensorflow官网
http://tensorflow.google.cn/
2. Pytorch中文文档
https://pytorch-cn.readthedocs.io/zh/latest/
3.https://thegradient.pub/state-of-ml-frameworks-2019-pytorch-dominates-research-tensorflow-dominates-industry/
4. 斯坦福大学面向视觉识别的卷积神经网络公开课(CS231n)
更多精彩内容
FCC30+
长按左边二维码
关注我们不迷路